#include "bsp_usart.h"

void DEBUG_USART_Init(void)
{
	gpio_init_type gpio_init_struct;
	
	crm_periph_clock_enable(DEBUG_USART_CRM_CLK, TRUE);
	crm_periph_clock_enable(DEBUG_USART_TX_CRM_CLK | DEBUG_USART_RX_CRM_CLK, TRUE);
	
	gpio_default_para_init(&gpio_init_struct);
	
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
	gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
	gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
	gpio_init_struct.gpio_pins = DEBUG_USART_TX_PIN;
	gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
	gpio_init(DEBUG_USART_TX_PORT, &gpio_init_struct);
	gpio_pin_mux_config(DEBUG_USART_TX_PORT, DEBUG_USART_TX_PIN_SOURCE, DEBUG_USART_TX_PIN_MUX_NUM);
	
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
	gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
	gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
	gpio_init_struct.gpio_pins = DEBUG_USART_RX_PIN;
	gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
	gpio_init(DEBUG_USART_TX_PORT, &gpio_init_struct);
	gpio_pin_mux_config(DEBUG_USART_RX_PORT, DEBUG_USART_RX_PIN_SOURCE, DEBUG_USART_RX_PIN_MUX_NUM);
	
	usart_init(DEBUG_USART, DEBUG_USART_BAUDRATE, USART_DATA_8BITS, USART_STOP_1_BIT);
	usart_transmitter_enable(DEBUG_USART, TRUE);
	usart_enable(DEBUG_USART, TRUE);
}

int fputc(int ch, FILE *f)
{
	while(usart_flag_get(DEBUG_USART, USART_TDBE_FLAG) == RESET);
	usart_data_transmit(DEBUG_USART, ch);
	return ch;
}